package validador;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Validador {
	private Modo modo;
	private Regla objetivo;
	private List<Object> objetosEntrada;

	/**
	 * @return the objetosEntrada
	 */
	public List<Object> getObjetosEntrada() {
		return objetosEntrada;
	}

	/**
	 * @param objetosEntrada the objetosEntrada to set
	 */
	public void setObjetosEntrada(List<Object> objetosEntrada) {
		this.modo.setObjetosEntrada(objetosEntrada);
	}

	public Validador(Modo modo, List<Object> objetosEntrada) {
		this.modo = modo;
		this.modo.setObjetosEntrada(objetosEntrada);
	}
	
	public Validador(Modo modo) {
		this.modo = modo;
	}

	/**
	 * @return el objetivo
	 */
	public Regla getObjetivo() {
		return objetivo;
	}

	/**
	 * @param objetivo
	 *            el objetivo a cargar
	 */
	public void setObjetivo(Regla objetivo) {
		this.objetivo = objetivo;
	}

	/**
	 * @return el modo
	 */
	public Modo getModo() {
		return modo;
	}

	/**
	 * @param modo
	 *            el modo a cargar
	 */
	public void setModo(Modo modo) {
		this.modo = modo;
	}

	/**
	 * 
	 * @param entrada los objetos de entrada
	 * @param regla la regla objetivo
	 * @return el resultado de la validacion
	 */
	public Boolean validarConjunto(Regla regla) {
		Boolean resultadoValidacion = new Boolean(false);
		List<Regla> hijos = regla.getHijos();
		Boolean reglaTieneHijos = hijos != null;

		if (reglaTieneHijos) {
			resultadoValidacion = regla.esValida(this.modo);
		} else {
			Iterator<Object> iteradorObjetosEntrada = this.modo.iterator();

			while (iteradorObjetosEntrada.hasNext()
					&& resultadoValidacion.equals(false)) {
				Object objeto = (Object) iteradorObjetosEntrada.next();
				resultadoValidacion = regla.esValida(objeto);
			}
		}
		return resultadoValidacion;
	}
}
